// 实现：token请求头携带，错误响应处理，401错误处理
import axios, { type Method } from 'axios'
import { useUserStore } from '@/stores'

import { showToast } from 'vant'
import router from '@/router'

const baseURL = 'https://consult-api.itheima.net'

// 创建axios实例，并配置请求跟路径
const instance = axios.create({
  baseURL,
  timeout: 10000
})
// 配置请求的拦截器   token请求头携带
// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    const store = useUserStore()
    console.log('所有的正常的请求在到达服务器之前都会经过这里', config)
    // 判断是否有token，如果有在headers中携带token
    if (store.userInfo?.token && config.headers) {
      config.headers.Authorization = `Bearer ${store.userInfo?.token}`
    }
    // 一定返回请求对象
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器   错误响应处理  401错误处理
instance.interceptors.response.use(
  function (response) {
    // 正常的响应在返回浏览器之前会经过这里
    console.log('正常的响应在返回浏览器之前会经过这里')
    // status=200 ,但data.code !== 10000 业务失败，axios不会主动抛出错误
    // 就需要我们自己手动抛出错误
    if (response.data.code !== 10000) {
      // 给一个轻提示
      showToast(response.data.message || '网络错误')
      // 抛出一个错误的响应
      return Promise.reject(response.data)
    }
    // 如果是正常的请求 脱壳  去掉一个data
    return response.data
  },
  function (error) {
    // 当状态码是400，500 代表错误的响应，一定会经过这里
    console.log('错误的响应在返回浏览器之前会经过这里')
    const store = useUserStore()
    // 401代表token认证失败
    if (error.response.status === 401) {
      // 清除token
      store.delUserInfo()
      // 返回登录页
      //   router.currentRoute.value.fullPath 获取当前页面的路径
      router.push(`/login?returnUrl=${router.currentRoute.value.fullPath}`)
    }

    //错误的响应在返回浏览器之前会经过这里
    return Promise.reject(error)
  }
)

// 给所有的响应的数据提供公共的类型声明
type Data<T> = {
  code: number
  message: string
  data: T
}

// obj = {name:'zs'}   obj[变量 表达式]
// 实现：导出一个通用的请求工具函数，支持设置响应数据类型
const request = <T>(
  url: string,
  method: Method = 'get',
  submitData?: object
) => {
  return instance.request<Data<T>, Data<T>>({
    url,
    method,
    // params  || data : submitData
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}

export { baseURL, instance, request }
